#ifndef __UART_H__
#define __UART_H__

#include "device.h"

#ifdef __cplusplus
extern "C" {
#endif

// UART事件
enum {
    UART_DATA_READY = 0U, 
};

// UART结构体
DEVICE_FEATURE_DECLARE 
(
    Uart,
    
    struct {
        /**
        * @brief 串口发送
        * @param pu8Data 待发送数据指针
        * @param u32Len 待发送数据长度
        * @return 发送成功返回0，否则返回错误码
        */
        uint8_t 
        (*pfnTransmit)(uint8_t* pu8Data, uint32_t u32Len);

        /**
        * @brief 串口接收
        * @param pu8Data 接收数据指针
        * @param u32Len 接收数据长度
        * @return 接收成功返回实际接收长度，否则返回错误码
        */
        uint32_t 
        (*pfnReceive)(uint8_t* pu8Data, uint32_t u32Len);
    },

    struct {
        uint8_t* pu8Data;   // 缓存数据指针
        uint32_t u32Len;    // 缓存长度
        uint32_t u32Head;   // 头位置
        uint32_t u32Tail;   // 尾位置
        uint32_t u32Index;  // 当前长度
        uint32_t u32TimeOut; // 超时时间(MS)
    }

);

/**
 * @brief UART设备注册
 * @param pstSelf UART设备结构体
 * @return Device_t* 注册成功返回设备结构体指针，失败返回NULL
 */
DEV_REG_DEC(uart, Uart_t)

/**
 * @brief 串口发送
 * @param pstDevice UART设备
 * @param pu8Data 待发送数据指针
 * @param u32Len 待发送数据长度
 * @return 发送成功返回DEV_RET_OK，否则返回错误码 @see DEV_RET_t
 */
DEV_RET_t
uart_transmit(Device_t* pstDevice, uint8_t* pu8Data, uint32_t u32Len);

/**
 * @brief 串口监控
 * @param pstDevice UART设备
 * @return 监控成功返回DEV_RET_OK，否则返回错误码 @see DEV_RET_t
 */
DEV_RET_t
uart_monitor(Device_t* pstDevice);

/**
 * @brief 串口发送
 * @param pstDevice UART设备
 * @param pu8Data 接收数据指针
 * @param pu32Len 实际接收数据长度
 * @return 发送成功返回DEV_RET_OK，否则返回错误码 @see DEV_RET_t
 */
 uint32_t
uart_receive(Device_t* pstDevice, uint8_t* pu8Data);

#ifdef __cplusplus
}
#endif

#endif /* __UART_H__ */
